#!/usr/bin/env python  
# -*- coding: utf-8 -*-  
import re 
  
def regex():
    str = 'abcdab' 
    patstr = 'ab'   
    ##可以匹配的2种方式：1       
    patobj = re.compile(patstr)
    got = patobj.match(str)
    ##2
    got = re.match(patstr,str)
       
    ##几个基本的匹配函数
    result = re.match('ab','abcd')   #match方法基本等同于re.search('^ab','abcd'),即默认就是前置匹配，只匹配字串的开头
    if result:
        print result.group()
    else:
        print result

    result = patobj.match('0abcd')
    if result:
        print result.group()
    else:
        print result, 'There is no result'
        
    result = patobj.search('0abcd')  ##匹配模式并返回第一个匹配对象
    if result:
        print result.group()
    else:
        print result 
        
    str = 'abcdab' 
    result = patobj.findall(str)  ##返回一个包含所有匹配结果的列表,如果匹配字串中有分组的话，则返回由分组内容组成的元组所组成的列表
    if result:                    ##即无分组时返回有多个group()结果的列表，有分组时返回有多个groups()结果的列表， 见下
        print type(result), result
    else:
        print result     
        
    result = patobj.finditer(str)  ##返回一个包含所有匹配结果的迭代器,可以配合findall使用
    if result:
        print type(result), result.next().group()
    else:
        print result

    result = patobj.sub('__','abcdab')  ##用指定的字符替换所有匹配到的字符串
    if result:
        print 'replace:',result    ##__cd__
    else:
        print result
        
    result = patobj.subn('__','abcdab')  ##用指定的字符替换所有匹配到的字符串,还包括替换数目
    if result:
        print 'replace:',result   ##('__cd__', 2)
    else:
        print result
        
    
    ##基本的几个结果查询方法：
    str = '[1]aaaa[2]bbbb[3]cccc@1[:]dddd'
    result = re.search(r'\[(\d+\](.*)@1\[(.*))\]',str)
    if result:
        print result.group()   ##返回匹配到的第一个完整字符串： [1]aaaa[2]bbbb[3]cccc@1[:]
        print result.group(1)  ##返回匹配的字符串中的第一个分组，就是第一个左扩弧和其对应的右扩弧中的所有包含的所有内容. 1]aaaa[2]bbbb[3]cccc@1[:
        print result.group(2)  ##aaaa[2]bbbb[3]cccc
        print result.group(3)  #最大为3，因为匹配字串里只有3个扩弧, :
        print result.groups()  ###把所有扩弧分组的内容放在一个元组对象中，并返回：('1]aaaa[2]bbbb[3]cccc@1[:', 'aaaa[2]bbbb[3]cccc', ':')
    else:
        print result   
        
        
    ##几个基本的匹配方式：贪婪与非贪婪
    str = '[1]aaaa[2]bbbb[3]cccc@1[:]dddd'
    result = re.search(r'\[.*\]',str) 
    if result:
        print result.group()     ##[1]aaaa[2]bbbb[3]cccc@1[:]
    else:
        print result
    
    str = '[1]aaaa[2]bbbb[3]cccc@1[:]dddd'
    result = re.search(r'\[.*?\]',str)   ###用一个?来控制贪婪
    if result:
        print result.group()     ##[1]              
    else:
        print result  
        
    
    ##其它的基本匹配和所有的语言都一样，通用的，除了一些高级的用法，不过可以参考官方手册中的样例，如果有需要的话
           
              
if __name__ == '__main__':  
    regex() 
